package com.boyunv.bridge.example03;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;

public class UserLogProxy implements MethodInterceptor {
    /**
     * s生成cgliib的动态代理方法
     * @param target
     * @return
     */
    public  Object  getLogProxy(Object target){
        //增强器累=类,创建动态代理类
        Enhancer enhancer = new Enhancer();
        //设置代理类的父类字节码对象
        enhancer.setSuperclass(target.getClass());
        //设置回调
        enhancer.setCallback(this);
        //创建动态代理对象并返回
        return enhancer.create();

    }

    /**
     * 实现回调的方法
     * @param o 代理对象
     * @param method  目标对象中的方法method实例
     * @param objects 实际参数
     * @param methodProxy 代理类对象中方法的method的实例
     * @return
     * @throws Throwable
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Calendar instance = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


        System.out.println(format.format(instance.getTime())+"["+method.getName()+"]查询用户信息");
        Object result = methodProxy.invokeSuper(o, objects);



        return result;
    }
    @Test
    public  void testCglibProxy(){
        //目标对象
        UserServiceImpl userService = new UserServiceImpl();
        System.out.println(userService.getClass());

        //代理对象
        UserServiceImpl logProxy =(UserServiceImpl) new UserLogProxy().getLogProxy(userService);
        System.out.println(logProxy.getClass());
        List<User> userList = logProxy.findUserList();
        System.out.println("用户信息"+userList);
    }

}
